package com.learn.finished;

/**
 * 给定一个已按照 非递减顺序排列  的整数数组 numbers ，请你从数组中找出两个数满足相加之和等于目标数 target 。
 * <p>
 * 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ，所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
 * <p>
 * 你可以假设每个输入 只对应唯一的答案 ，而且你 不可以 重复使用相同的元素。
 */

public class num_167 {
    public static int[] twoSum(int[] numbers, int target) {
        //不能用快慢指针，用普通的双指针就行，头尾双指针
        int low = 0, high = numbers.length - 1;
        while (low < high) {
            int sum = numbers[low] + numbers[high];
            if (sum == target) {
                return new int[]{low + 1, high + 1};
            } else if (sum < target) {
                low++;
            } else {
                high--;
            }
        }
        return new int[]{-1, -1};

    }
    public static int[] binaryTwoSum(int[] numbers, int target) {
//        下面是二分查找的方法
        for (int i = 0; i < numbers.length; i++) {
            //为了避免重复寻找，在寻找第二个数时，只在第一个数的右侧寻找。
            //所以，low得+1
            int low = i + 1, high = numbers.length - 1;
            while (low <= high) {
                int mid = (high - low) / 2 + low;
                if (numbers[mid] == target - numbers[i]) {
                    return new int[]{i + 1, mid + 1};
                } else if (numbers[mid] > target - numbers[i]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
        }
        return new int[]{-1, -1};
//        for (int i = 0; i < numbers.length; i++) {
//            int low=i;
//            int high=numbers.length-1;
//            while (low <= high) {
//                int mid=(high-low)/2+low;
//                if (numbers[mid]==target-numbers[i]){
//                    return new int[]{i+1,mid+1};
//                }else if(numbers[mid]>target-numbers[i]){
//                    high=mid-1;
//                }else {
//                    low=mid+1;
//                }
//            }
//        return new int[]{-1, -1};
//        }
    }


    public static void main(String[] args) {

    }
}
